package com.wcs.exam.dao;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wcs.exam.common.base.page.Page;
import com.wcs.exam.dao.po.ExamUserRankPO;
import com.wcs.exam.dao.impl.mapper.entity.ExamUser;

import java.util.Collection;
import java.util.List;

/**
 * 考试用户 持久化接口
 *
 * @author wcs
 * @since 2025-03-13
 */
public interface ExamUserDao extends IService<ExamUser> {

    /**
     * 根据条件分组统计
     *
     * @param wrapper   统计条件
     * @param classType 返回类型
     * @param <R>       统计结果类型
     * @return 统计结果
     */
    <R> List<R> selectObjs(Wrapper<ExamUser> wrapper, Class<R> classType);

    /**
    * 获取最大排序
    *
    * @return 最大排序
    */
    Integer getMaxSort();

    /**
     * 根据考试ID和用户ID查询考试用户
     *
     * @param examId 考试ID
     * @param userId 用户ID
     * @return 考试用户
     */
    ExamUser getByExamIdAndUserId(Long examId, Long userId);

    /**
     * 根据考试类型、考试ID和用户ID查询考试用户
     *
     * @param examType 考试类型
     * @param examId   考试ID
     * @param userId   用户ID
     * @return 考试用户
     */
    ExamUser getByExamTypeAndExamIdAndUserId(Integer examType, Long examId, Long userId);

    /**
     * 根据考试类型、考试ID和用户ID查询考试用户排名
     * @param examType 考试类型
     * @param examId 考试ID
     * @param userId 用户ID
     * @return 用户排名
     */
    Integer getRankNoByExamTypeAndExamIdAndUserId(Integer examType, Long examId, Long userId);

    /**
     * 分页查询考试排名
     *
     * @param examType    考试类型
     * @param examId      考试ID
     * @param userIds     用户ID
     * @param pageCurrent 当前页
     * @param pageSize    每页条数
     * @return 考试排名
     */
    Page<ExamUserRankPO> rankPage(Integer examType, Long examId, Collection<Long> userIds, long pageCurrent, long pageSize);

}
